package com.billdowney.qq.robot.plugins;

import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 机器人插件管理，必须通过spring扫描注入
 *
 * @author BillDowney
 * @date 2021/4/5 12:33
 */
@Component
public class RobotPluginManage {

    /**
     * 暂存所有插件，防止重复从spring中获取
     */
    private static final Map<String, RobotPlugin> PLUGINS_ALL = new LinkedHashMap<>();
    /**
     * 启动标记
     */
    private static final Map<String, Boolean> PLUGINS_FLAG = new HashMap<>();
    /**
     * 启动的插件列表
     */
    private static final List<RobotPlugin> PLUGINS_START = new ArrayList<>();

    public RobotPluginManage(List<RobotPlugin> plugins) {
        super();
        plugins.forEach(item -> {
            PLUGINS_ALL.put(item.info().getName(), item);
            PLUGINS_FLAG.put(item.info().getName(), item.info().isStart());
        });
        this.resetStartList();
    }

    /**
     * 获取启动的插件列表
     *
     * @return 插件列表
     */
    public List<RobotPlugin> getStart() {
        return PLUGINS_START;
    }

    /**
     * 获取所有的插件列表
     *
     * @return 插件列表
     */
    public Map<String, RobotPlugin> getAll() {
        return PLUGINS_ALL;
    }

    /**
     * 获取所有的插件，包含启动标记
     *
     * @return 插件列表
     */
    public Map<RobotPlugin, Boolean> getAllFlag() {
        return PLUGINS_ALL.values().stream().collect(Collectors.toMap(item -> item, item -> PLUGINS_FLAG.get(item.info().getName())));
    }

    /**
     * 查询插件是否启动
     *
     * @param name 插件名称{@link RobotPlugin#info()}
     */
    public boolean isStart(String name) {
        return PLUGINS_FLAG.get(name);
    }

    /**
     * 根据插件名称启动插件
     *
     * @param name 插件名称{@link RobotPlugin#info()}
     */
    public void start(String name) {
        if (PLUGINS_FLAG.containsKey(name)) {
            PLUGINS_FLAG.put(name, true);
            this.resetStartList();
        }
    }

    /**
     * 根据插件名称停止插件
     *
     * @param name 插件名称{@link RobotPlugin#info()}
     */
    public void stop(String name) {
        if (PLUGINS_FLAG.containsKey(name)) {
            PLUGINS_FLAG.put(name, false);
            this.resetStartList();
        }
    }

    /**
     * 根据插件名称获取插件信息
     *
     * @param name 插件名称{@link RobotPlugin#info()}
     */
    public RobotPlugin get(String name) {
        return PLUGINS_ALL.get(name);
    }

    /**
     * 重置启动列表
     */
    public void resetStartList() {
        PLUGINS_START.clear();
        PLUGINS_START.addAll(PLUGINS_ALL.values().stream().filter(item -> PLUGINS_FLAG.get(item.info().getName())).collect(Collectors.toList()));
    }

    public boolean isEmpty() {
        return PLUGINS_START.isEmpty();
    }

    public boolean isNotEmpty() {
        return !PLUGINS_START.isEmpty();
    }
}
